package cn.wolfcode.wms.web.interceptors;

import cn.wolfcode.wms.domain.Employee;
import cn.wolfcode.wms.util.MySecuriryException;
import cn.wolfcode.wms.util.NeedPermission;

import cn.wolfcode.wms.util.StringExpression;
import cn.wolfcode.wms.util.UserContext;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.List;

//权限管理
public class SecurityCheckInterceptor extends HandlerInterceptorAdapter {


    //要做权限管理的方法
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        //先判断该用户是否是超级管理员
        Employee user = UserContext.getCurrentUser();
        if(user.isAdmin()){//是超级管理员
            //放行
            return true;
        }
        //获取到被访问的方法
        HandlerMethod hm = (HandlerMethod) handler;
        Method m = hm.getMethod();
        //判断被访问的方法是否需要权限访问
        if(!m.isAnnotationPresent(NeedPermission.class)){//表示访问该方法不需要权限
            //放行
            return true;
        }

        //来到这里表示被访问的方法需要权限
        String exp = StringExpression.experssion(m);
        //获取用户的权限表达式
        List<String> exps = UserContext.getExpression();
        //判断该用户是否有权访问该方法
        if(exps.contains(exp)){
            //来到这里表示用户有权访问这个方法
            return true;
        }

        //用户没有权限访问,抛出自定义异常,
        throw new MySecuriryException();
    }
}
